package cn.lcsjsxy.yxc.objectoriented.抽象类;
/*
* abstract关键字的使用
* 1.abstract：抽象的
* 2.abstract可以用来修饰的结构，类、方法
* 3.abstract修饰类：com.yang_xc.objectoriented.抽象类
*   》此类不能实例化
*   》抽象类中一定有构造器，便于子类对象实体化时调用（涉及：子类对象实例化的过程）
*   》开发中，都会提供抽象类的子类，让子类对象实例化，完成相关的操作
*
* 4.abstract修饰方法：抽象方法
*   》抽象方法只有方法的声明，没有方法体
*   》包含抽象方法的类，一定是一个抽象类。反之，抽象类中可以没有抽象方法。
*   》若子类重写了父类中的所有的抽象方法之后，此子类方可实例化
*     若子类没有重写父类中所有的抽象方法，则此子类也是一个抽象类，需要abstract修饰
*
* abstract使用上的注意点：
* 1.abstract不能用来修饰：属性、构造器等结构
* 2.abstract不能用来修饰私有方法（私有方法无法重写）、静态方法（非静态才能重写）、final的方法(不让重写）、final的类（不让继承）
* */
public class AbstractTest {
    public static void main(String[] args) {
        //一旦Person类抽象了，就不可实例化
//        com.yang_xc.miscellaneous.Person p1=new com.yang_xc.miscellaneous.Person();
//        p1.eat();
    }
}

abstract class Person{
    String name;
    int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println("人吃饭");
    }

    /**
     * 抽象方法
     */
    public abstract void walk();
}

class Student extends Person{  //类“Student”必须声明为抽象，或为实现“com.yang_xc.miscellaneous.Person”中的抽象方法“walk()”

    public Student() {
    }

    public Student(String name, int age) {
        super(name, age);
    }

    public void walk(){
        System.out.println("走走走走走走走走走走走走走走走走");
    }
}
